﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using GSQ.BusinessEntities;
using GSQ.DataAccess.DataSetTableAdapters;

namespace GSQ.DataAccess
{
    public class ProductosDA
    {
        private PRODUCTOSTableAdapter Adapter = new PRODUCTOSTableAdapter();
        private V_PRODUCTOSTableAdapter vAdapter = new V_PRODUCTOSTableAdapter();
        private V_PRODUCTOS_MOVIMIENTOSTableAdapter vMovimientosAdapter = new V_PRODUCTOS_MOVIMIENTOSTableAdapter();
        private DataSet.PRODUCTOSDataTable entities;
        private DataSet.PRODUCTOSRow entity;
         
        public decimal Insert(PRODUCTOS value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    Adapter.Connection = cnn;

                    entities = new DataSet.PRODUCTOSDataTable();
                    entity = entities.NewPRODUCTOSRow();

                    entity.ID = value.ID;
                    entity.CODIGO = value.CODIGO;
                    entity.ID_MARCA = value.ID_MARCA;
                    entity.ID_MEDIDA = value.ID_MEDIDA;
                    entity.ID_ORIGINAL = value.ID_ORIGINAL;
                    if (value.UBICACION != null && value.UBICACION != string.Empty)
                        entity.UBICACION = value.UBICACION;
                    entity.COSTO = value.COSTO;
                    entity.PRECIO = value.PRECIO;
                    entity.X_GANANCIA = value.X_GANANCIA;
                    entity.EXISTENCIA = value.EXISTENCIA;
                    entity.MINIMO = value.MINIMO;
                    entity.MAXIMO = value.MAXIMO;
                    entity.IMPUESTOS = value.IMPUESTOS;
                    entity.DESCUENTO = value.DESCUENTO;
                    entity.SERVICIO = value.SERVICIO;
                    entity.ACTIVO = value.ACTIVO;

                    entities.AddPRODUCTOSRow(entity);

                    Adapter.Update(entities);

                    value.ID = entity.ID;
                    return value.ID;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public decimal Update(PRODUCTOS value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.Adapter.Connection = cnn;

                    entities = Adapter.GetDataByID(value.ID);
                    entity = entities.FirstOrDefault();

                    entity.CODIGO = value.CODIGO;
                    entity.ID_MARCA = value.ID_MARCA;
                    entity.ID_MEDIDA = value.ID_MEDIDA;
                    entity.ID_ORIGINAL = value.ID_ORIGINAL;
                    if (value.UBICACION != null && value.UBICACION != string.Empty)
                        entity.UBICACION = value.UBICACION;
                    entity.COSTO = value.COSTO;
                    entity.PRECIO = value.PRECIO;
                    entity.X_GANANCIA = value.X_GANANCIA;
                    entity.EXISTENCIA = value.EXISTENCIA;
                    entity.MINIMO = value.MINIMO;
                    entity.MAXIMO = value.MAXIMO;
                    entity.IMPUESTOS = value.IMPUESTOS;
                    entity.DESCUENTO = value.DESCUENTO;
                    entity.SERVICIO = value.SERVICIO;
                    entity.ACTIVO = value.ACTIVO;

                    this.Adapter.Update(entities);

                    return entity.ID;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public PRODUCTOS GetById(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;

                    DataSet.V_PRODUCTOSRow rw = vAdapter.GetDataByID(id).FirstOrDefault();
                    PRODUCTOS producto = null;
                    if (rw != null)
                    {
                        producto = GetEntity(rw);
                    }
                    return producto;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public PRODUCTOS GetByCodigo(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;

                    DataSet.V_PRODUCTOSRow rw = vAdapter.GetDataByCodigo(value.Trim()).FirstOrDefault();
                    PRODUCTOS producto = null;
                    if (rw != null)
                    {
                        producto = GetEntity(rw);
                    }
                    return producto;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetAll()
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetData())
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByCodigoTodos(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByCodigoTodos(value.Trim()))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByIdOriginal(decimal value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByIdOriginal(value))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByNroOriginal(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByNroOriginal(value.Trim()))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByDescripcion(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByDescripcion(value.Trim()))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByIdDescripcion(decimal value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByIdDescripcion(value))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByCategoria(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByCategoria(value.Trim()))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByIdCategoria(decimal value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByIdCategoria(value))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByDepartamento(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByDepartamento(value.Trim()))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByIdDepartamento(decimal value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByIdDepartamento(value))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByMarca(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByMarca(value.Trim()))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS> GetByIdMarca(decimal value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapter.Connection = cnn;
                    List<PRODUCTOS> list = new List<PRODUCTOS>();
                    foreach (DataSet.V_PRODUCTOSRow rw in vAdapter.GetDataByIdMarca(value))
                    {
                        list.Add(GetEntity(rw));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public Tuple<List<PRODUCTOS>,List<ORIGINALES_ADICIONALES>>GetByStartWord(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.Adapter.Connection = cnn;
                    ORIGINALES_ADICIONALESTableAdapter AdapterOA = new ORIGINALES_ADICIONALESTableAdapter();
                    AdapterOA.Connection = cnn;

                   
                    DataSet.ORIGINALES_ADICIONALESDataTable oaTD = AdapterOA.GetDataByStartNroAdicional(value.Trim());
                    List<ORIGINALES_ADICIONALES> entOA = new List<ORIGINALES_ADICIONALES>();

                    foreach( DataSet.ORIGINALES_ADICIONALESRow rw in oaTD)
                    {
                    entOA.Add(new ORIGINALES_ADICIONALES{NRO_ADICIONAL = rw.NRO_ADICIONAL});
                    }

                     DataSet.PRODUCTOSDataTable pTD = Adapter.GetDataByStartCodigo(value.Trim());
                     List<PRODUCTOS> entP = new List<PRODUCTOS>();

                    foreach( DataSet.PRODUCTOSRow rw in pTD)
                    {
                    entP.Add(new PRODUCTOS{CODIGO = rw.CODIGO});
                    }

                  //  Tuple<LPRODUCTOS, ORIGINALES_ADICIONALES> tp = new Tuple<ListPRODUCTOS, ORIGINALES_ADICIONALES>(entP, entOA);
                    return new Tuple<List<PRODUCTOS>, List<ORIGINALES_ADICIONALES>>(entP, entOA);
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<PRODUCTOS_MOVIMIENTOS> GetByFechasCodigo(DateTime fecha1, DateTime fecha2, string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vMovimientosAdapter.Connection = cnn;
                    List<PRODUCTOS_MOVIMIENTOS> list = new List<PRODUCTOS_MOVIMIENTOS>();
                    foreach (DataSet.V_PRODUCTOS_MOVIMIENTOSRow  rw in vMovimientosAdapter.GetDataByFechasCodigo(fecha1.Date, fecha2.Date,value.Trim()))
                    {
                        PRODUCTOS_MOVIMIENTOS productosMovimientos = new PRODUCTOS_MOVIMIENTOS();
                        productosMovimientos.TIPO_MOVIMIENTO = rw.TIPO_MOVIMIENTO;
                        productosMovimientos.ID = rw.ID;
                        productosMovimientos.CONDICION = rw.CONDICION;
                        productosMovimientos.FECHA = rw.FECHA;
                        productosMovimientos.NOMBRE = rw.NOMBRE;
                        productosMovimientos.NRO_ORIGINAL = rw.NRO_ORIGINAL;
                        productosMovimientos.CODIGO = rw.CODIGO;
                        productosMovimientos.DESCRIPCION = rw.DESCRIPCION;
                        productosMovimientos.CANTIDAD = rw.CANTIDAD;
                        productosMovimientos.C_DEVUELTA = rw.C_DEVUELTA;
                        productosMovimientos.COSTO = rw.COSTO;
                        productosMovimientos.PRECIO = rw.PRECIO;
                        productosMovimientos.ACTIVO = rw.ACTIVO;
                        productosMovimientos.NRO_DOCUMENTO = rw.NRO_DOCUMENTO;
                        list.Add(productosMovimientos);
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        
        }

        private PRODUCTOS GetEntity(DataSet.V_PRODUCTOSRow rw)
        {
            PRODUCTOS producto = null;
            if (rw != null)
            {
                producto = new PRODUCTOS();
                producto.ID = rw.ID;
                producto.CODIGO = rw.CODIGO;
                producto.ID_MARCA = rw.ID_MARCA;
                producto.MARCAS = new MARCAS { ID = rw.ID_MARCA, MARCA = rw.MARCA };
                producto.ID_MEDIDA = rw.ID_MEDIDA;
                producto.MEDIDAS = new MEDIDAS { ID = rw.ID_MEDIDA, MEDIDA = rw.MEDIDA };
                producto.ID_ORIGINAL = rw.ID_ORIGINAL;
                producto.ORIGINALES = new ORIGINALES { ID = rw.ID_ORIGINAL, NRO_ORIGINAL = rw.NRO_ORIGINAL, ID_CATEGORIA = rw.ID_CATEGORIA, ID_DESCRIPCION = rw.ID_DESCRIPCION };
                producto.DEPARTAMENTOS = new DEPARTAMENTOS { ID = rw.ID_DEPARTAMENTO, DEPARTAMENTO = rw.DEPARTAMENTO };
                producto.CATEGORIAS = new CATEGORIAS { ID = rw.ID_CATEGORIA, CATEGORIA = rw.CATEGORIA };
                producto.DESCRIPCIONES = new DESCRIPCIONES { ID = rw.ID_DESCRIPCION, DESCRIPCION = rw.DESCRIPCION };
                if (!rw.IsUBICACIONNull())
                    producto.UBICACION = rw.UBICACION;
                producto.COSTO = rw.COSTO;
                producto.PRECIO = rw.PRECIO;
                producto.X_GANANCIA = rw.X_GANANCIA;
                producto.EXISTENCIA = rw.EXISTENCIA;
                producto.MINIMO = rw.MINIMO;
                producto.MAXIMO = rw.MAXIMO;
                producto.IMPUESTOS = rw.IMPUESTOS;
                producto.DESCUENTO = rw.DESCUENTO;
                producto.SERVICIO = rw.SERVICIO;
                producto.ACTIVO = rw.ACTIVO;
            }
            return producto;
        }
    }
}
